www.gusucode.com > C++ 各种排序算法演示(插入、希尔、冒泡、快速等)-源码程序 > C++ 各种排序算法演示(插入、希尔、冒泡、快速等)-源码程序/code/QuickSort/main.cpp
//Download by http://www.NewXing.com #include<iostream> #include<ctime> using namespace std; //数组的第一个元素就不参与到排序中,即测试数据的第一个记录不参与排序 //为数组的第一个元素r[0]留作他用 //快速排序 //快速排序一次划分函数 int compare(0),move(0); int Partition(int r[],int low,int high) { r[0]=r[low]; while(low<high) { while(low<high&&r[high]>=r[0]) { --high; compare++; } r[low]=r[high]; move++; while(low<high&&r[low]<=r[0]) { ++low; compare++; } r[high]=r[low]; move++; } r[low]=r[0]; return low; } //快速排序递归函数 void QuickSort(int r[],int first,int end) { int pivot; if(first<end) { pivot=Partition(r,first,end); QuickSort(r,first,pivot-1); QuickSort(r,pivot+1,end); } } void main() { int i; cout<<"快速排序测试:"<<endl; cout<<endl; cout<<"测试数据为正序:"<<endl; int quick1[10]={10,20,30,40,50,60,70,80,90,100}; cout<<"排序前:"<<endl; for(i=1;i<10;i++) cout<<quick1[i]<<' '; cout<<endl; QuickSort(quick1,0,9); cout<<"比较次数:"<<compare<<endl; cout<<"移动次数:"<<move<<endl; compare=0; move=0; cout<<"排序后:"<<endl; for(i=1;i<10;i++) cout<<quick1[i]<<' '; cout<<endl; cout<<endl; cout<<"测试数据为逆序:"<<endl; int quick2[10]={111,99,88,77,66,55,44,33,22,11}; cout<<"排序前:"<<endl; for(i=1;i<10;i++) cout<<quick2[i]<<' '; cout<<endl; QuickSort(quick2,0,9); cout<<"比较次数:"<<compare<<endl; cout<<"移动次数:"<<move<<endl; compare=0; move=0; cout<<"排序后:"<<endl; for(i=1;i<10;i++) cout<<quick2[i]<<' '; cout<<endl; cout<<endl; cout<<"测试数据为随机数据:"<<endl; srand((unsigned)time(NULL)); int random[10]; for(i=1;i<10;i++) random[i]=rand()%20; cout<<"排序前:"<<endl; for(i=1;i<10;i++) cout<<random[i]<<' '; cout<<endl; QuickSort(random,0,9); cout<<"比较次数:"<<compare<<endl; cout<<"移动次数:"<<move<<endl; compare=0; move=0; cout<<"排序后:"<<endl; for(i=1;i<10;i++) cout<<random[i]<<' '; cout<<endl; cout<<endl; cout<<"快速排序结束。"<<endl; cout<<endl; } /*#include<iostream> #include<ctime> using namespace std; //(只要有哨兵)数组的第一个元素就不参与到排序中,换言之测试数据的第一个记录不参与排序 //不过插入排序的正序排列因为不移动元素所以无上情况 //有类似情况的:插入排序;希尔排序;冒泡排序;简单选择排序 //快速排序有问题! //快速排序 //快速排序一次划分函数 int Partition(int r[],int low,int high) { r[0]=r[low]; while(low<high) { while(low<high&&r[high]>=r[0]) --high; r[low]=r[high]; while(low<high&&r[low]<=r[0]) ++low; r[high]=r[low]; } r[low]=r[0]; return low; } //快速排序非递归函数 void QuickSort(int r[],int n) { int top=-1;//顺序栈并假设无上溢 int low=0,high=n-1; int i,s[20]; while(low<high||top!=-1) { while(low<high) { i=Partition(r,low,high);//一次划分 s[++top]=i;//入栈 high=i-1;//high指向左半序列最末记录 } if(top!=-1) { i=s[top--];//出栈 low=i+1;//low指向右半序列起始记录 } } } void main() { int i; cout<<"快速排序测试:"<<endl; cout<<endl; cout<<"测试数据为正序:"<<endl; int quick1[10]={10,20,30,40,50,60,70,80,90,100}; cout<<"排序前:"<<endl; for(i=1;i<10;i++) cout<<quick1[i]<<' '; cout<<endl; QuickSort(quick1,10); cout<<"排序后:"<<endl; for(i=1;i<10;i++) cout<<quick1[i]<<' '; cout<<endl; cout<<endl; cout<<"测试数据为逆序:"<<endl; int quick2[10]={111,99,88,77,66,55,44,33,22,11}; cout<<"排序前:"<<endl; for(i=1;i<10;i++) cout<<quick2[i]<<' '; cout<<endl; QuickSort(quick2,10); cout<<"排序后:"<<endl; for(i=1;i<10;i++) cout<<quick2[i]<<' '; cout<<endl; cout<<endl; cout<<"测试数据为随机数据:"<<endl; srand((unsigned)time(NULL)); int random[10]; for(i=1;i<10;i++) random[i]=rand()%20; cout<<"排序前:"<<endl; for(i=1;i<10;i++) cout<<random[i]<<' '; cout<<endl; QuickSort(random,10); cout<<"排序后:"<<endl; for(i=1;i<10;i++) cout<<random[i]<<' '; cout<<endl; cout<<endl; cout<<"快速排序结束。"<<endl; cout<<endl; }*/